package at.chl.genetic.random;

import at.chl.genetic.node.IDecisionNode;
import at.chl.genetic.node.builder.INodeBuilder;
/**
 * Implementations of this Interface should provide logic to create random<br>
 * DecisionTrees. 
 * The factory has to be able to register NodeBuilders and (maybe) special<br>
 * behaviors to change the how the tree is build.
 * 
 * The factory also has to provide methods to change the trees dimensions.<br>
 * @author chl
 *
 *
 */
public interface IRandomDecisionNodeFactory {
	
	public final long DEFAULT_MAX_DEPTH = 5;
	public final long DEFAULT_MAX_CHILDS = 25;
	
	/**
	 * Register a Node for the DecisionTree
	 * @param nodeClass - Class of the Node which should be registered
	 */
	public boolean registerDecisionNodeBuilder(INodeBuilder nodeBuilder);
	
	/**
	 * Sets the tree depth. Default should be DEFAULT_MAX_DEPTH(5)
	 * @param depth - the tree's max depth
	 */
	public void setMaxDepth(long depth);
	
	public void setMaxChilds(long maxChilds);
	
	/**
	 * Creates a DecisionTree
	 * @return - DecisionNode with children, closed tree
	 */
	public IDecisionNode createDecisionTree();
	
	/**
	 * Creates a DecisionTree
	 * @param startDepth - starting depth (if maxDpeth is 5 startingDepth is 2 there is a maxdepth from 3)
	 * @param startChilds - starting childs (as depth above)
	 * @return - DecisionNode with children, closed tree
	 */
	public IDecisionNode createDecisionTree(Long startDepth,Long startChilds);
	
	
	
	
}
